package com.example.mybatisplus.tag.service;

import com.example.mybatisplus.dynamic.DynamicDataSource;
import com.example.mybatisplus.tag.dao.MybatisTagMapper;
import com.example.mybatisplus.tag.domain.User;
import com.example.mybatisplus.tag.domain.UserInfo;
import com.example.mybatisplus.tag.util.MybatisTagUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * @Author longdeng
 * @Date 2020/9/21 0021 20:38
 */
@Slf4j
@Component
public class MybatisTagService {

    @Value("${MybatisTagService.MAX_LIMIT_NUM}")
    private int MAX_LIMIT_NUM;

    private Logger logger = LoggerFactory.getLogger(MybatisTagService.class);

    @Autowired
    private MybatisTagMapper mybatisTagMapper;


    /**
     * 测试resultMap标签信息
     *
     * @return
     */
    public List<UserInfo> resultMap() {
        return mybatisTagMapper.resultMap();
    }

    /**
     * 使用if标签测试 if+where标签一起使用
     *
     * @param map
     * @return
     */
    public List<User> ifTag(Map<String, Object> map) {
        return mybatisTagMapper.ifTag(map);
    }


    /**
     * 使用foreach标签 - 测试
     *
     * @param map
     * @return
     */
    public List<User> foreachTag(Map<String, Object> map) {
        List<String> list = new ArrayList<>(map.size());
        String prefixStr = "u";
        for (int i = 1; i <= map.size(); i++) {
            list.add((String) map.get(prefixStr + i));
        }
        return mybatisTagMapper.foreachTag(list);
    }

    /**
     * 测试choose标签
     *
     * @param map
     * @return
     */
    public List<User> chooseTag(Map<String, Object> map) {
        return mybatisTagMapper.chooseTag(map);
    }

    /**
     * 测试set标签的使用
     *
     * @param map
     * @return
     */
    public void setTag(Map<String, Object> map) {
        mybatisTagMapper.setTag(map);
    }

    /**
     * 测试trim标签的使用
     *
     * @param map
     * @return
     */
    public List<User> trimTag(Map<String, Object> map) {
        return mybatisTagMapper.trimTag(map);
    }

    /**
     * include标签测试使用
     *
     * @param map
     * @return
     */
    public List<User> includeTag(Map<String, Object> map) {
        return mybatisTagMapper.includeTag(map);
    }

    /**
     * 使用foreach标签批量生成数据信息
     * 当前方法需要传入两个参数
     * ds_type , 数据源类型
     * num     , 需要插入数据库的数据量
     *
     * @param map
     * @return
     */
    public Object addUsers(Map<String, Object> map) {
        String dsType = MybatisTagUtil.obj2String(map.get("ds_type"));
        if (dsType != null && "ds1".equals(dsType)) {
            return addUsersByDs1(map);
        } else if (dsType != null && "ds2".equals(dsType)) {
            return addUsersByDs2(map);
        }
        logger.info("参数异常：{} 参数信息为 {} ", "addUser", map);
        return null;
    }

    /**
     * 添加用户到数据库中
     *
     * @param map
     * @return
     */
    private Object addUsersToDs(Map<String, Object> map) {
        String numStr = MybatisTagUtil.obj2String(map.get("num"));
        int num = 0;
        if (numStr != null) {
            try {
                num = Integer.parseInt(numStr);
            } catch (Exception ex) {
                logger.info("数字解析异常:{} 参数为 {}", "addUsersByDs1", numStr);
                return null;
            }
        }
        List<User> userList = new ArrayList<>(MAX_LIMIT_NUM);
        int index = 0;
        for (int i = 0; i < num; i++) {
            index++;
            User user = new User();
            user.setUserid(UUID.randomUUID().toString().replaceAll("-", ""));
            user.setAge(new Random().nextInt(num));
            user.setLc("0");
            user.setVersion(1);
            user.setName("zhouxl-ds-" + (i + 1));
            userList.add(user);

            if (i == num - 1) { // 清空数据到数据库
                mybatisTagMapper.addUsers(userList);
                userList.clear();
                break;
            }
            if (index == MAX_LIMIT_NUM) {   // 每到100此提交数据
                mybatisTagMapper.addUsers(userList);
                userList.clear();
                index = 0;  // 还原下标数据
            }
        }
        return num;
    }

    /**
     * 添加数据到数据库ds1
     *
     * @param map
     * @return
     */
    @DynamicDataSource(value = "ds1")
    private Object addUsersByDs1(Map<String, Object> map) {
        return addUsersToDs(map);
    }

    /**
     * 添加数据到数据库ds2
     *
     * @param map
     * @return
     */

    private Object addUsersByDs2(Map<String, Object> map) {
        return addUsersToDs(map);
    }
}
